#include <stdio.h>
#include <string.h>

// 交换函数 
void swap_int(int val_1 , int val_2);

void swap_double(double val_1 , double val_2);

void swap(void * val_1 , void * val_2 , size_t size)
{
    char temp[size];
    memcpy(temp , val_1 , size);
    memcpy(val_1 , val_2 , size);
    memcpy(val_2 , temp , size);
}


typedef int (cmp_func_t)(const void *, const void *);

/*
base    数据基地址
nmemb   元素个数
size    元素大小
func    函数指针
思考 ：
    如何解决  base 地址偏移的问题
    

*/


void my_qsort(void *base, size_t nmemb, size_t size, cmp_func_t func)
{
    char data[nmemb * size];
    // 拷贝数据
    memcpy( data , base , nmemb * size);

    for (size_t i = 0; i < nmemb  ; i++)  // 
    {
        for (size_t j = 0; j < nmemb - i - 1 ; j++)
        {
            // // 对比交换
            // if (0 < (func(base[j] , base[j + 1])))
            // {
            //     // 交换数据
            //     int temp  = arr[j];
            //     arr[j] = arr[j + 1];
            //     arr[j + 1] = temp;
            // }
        }
    }
}

/*
void *memcpy(void *dest, const void *src, size_t n);
功能: 从 src 中拷贝 n 个数据 到 dest
参数:
    dest    目标首地址
    src     源数据首地址
    n       操作大小
返回值
    成功    返回 dest 指针
    失败    不存在     
*/


int main(int argc, char const *argv[])
{
    double val_1 = 123.123;
    double val_2 = 456.123;

    swap(&val_1 , &val_2 , sizeof(val_1));

    printf("val_1 = %f val_2 = %f\n" , val_1 , val_2);
    return 0;
}


